package com.yc.utils;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 文件类型校验工具类
 * 用于校验上传文件的 MIME 类型 和 扩展名是否符合允许范围
  */
public class FileTypeValidator {
    // 允许的 MIME 类型（根据请求头 content-type 判断）
    private static final Set<String> ALLOWED_MIME_TYPES = new HashSet<>(Arrays.asList(
            "image/jpeg",
            "image/png",
            "image/gif",
            "application/pdf",
            "application/msword", // .doc
            "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .docx
            "application/vnd.ms-excel", // .xls
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" // .xlsx
    ));

    // 允许的文件扩展名
    private static final Set<String> ALLOWED_EXTENSIONS = new HashSet<>(Arrays.asList(
            "jpg", "jpeg", "png", "gif",
            "pdf",
            "doc", "docx",
            "xls", "xlsx"
    ));

    /**
     * 校验上传文件的 MIME 类型 和 扩展名是否合法
     * @param contentType 上传文件的 MIME 类型（如 multipart/form-data 中的 Content-Type）
     * @param filename    原始文件名
     * @return 合法返回 true，否则返回 false
     */
    public static boolean isValidFileType(String contentType, String filename) {
        if (contentType == null || filename == null || contentType.isEmpty() || filename.isEmpty()) {
            return false; // Or throw an IllegalArgumentException
        }

        // 1. 检查 MIME 类型
        if (!ALLOWED_MIME_TYPES.contains(contentType.toLowerCase())) {
            return false;
        }

        // 2.  检查文件扩展名
        String fileExtension = getFileExtension(filename);
        if (fileExtension == null || !ALLOWED_EXTENSIONS.contains(fileExtension.toLowerCase())) {
            return false;
        }

        return true;
    }

    //获取文件名中的扩展名（不含点）
    private static String getFileExtension(String filename) {
        int dotIndex = filename.lastIndexOf('.');
        if (dotIndex > 0 && dotIndex < filename.length() - 1) {
            return filename.substring(dotIndex + 1);
        }
        return null;
    }
}
